home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 July / EnigmA AMIGA RUN 29 (1998)(G.R. Edizioni)(IT)[!][issue 1998-07 & 08].iso / recent / amibon.lha / AmiBonlex / Extra / checkdxr2.c < prev    next >
C/C++ Source or Header  |  1998-06-08  |  7KB  |  340 lines

  1. /* BonLex program - tar fram data för .DXR filer */
  2. /* EE 960715, 961027 */
  3. /* Misslyckas med att hitta texter ex T043.dxr */
  4.  
  5. /* Hitta
  6.          * txtCastNames (eller CAS* om det inte fanns) därefter följer 
  7.            CASt blocken som förhoppningsvis är 'giltiga'
  8.          * Första STXT blocket därefter
  9. */
  10. #define _STRICT_ANSI
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <strings.h>
  15. #include <ctype.h>
  16. #ifdef _AMIGA
  17.   #include <dos.h>
  18. #endif
  19.  
  20. #pragma msg 62 ignore
  21. #pragma msg 187 ignore
  22.  
  23. #define ZCASt 0x43415374
  24. #define ZSTXT 0x53545854
  25. #define ZCAS_ 0x4341532a
  26.  
  27. char infile[128];
  28. FILE *fp;
  29.  
  30. char ordData[80], temp; 
  31. long int langd, slask, stxtpos, namepos, picpos,
  32.              rawnum,rawlen,rawpos;
  33. short int npic,nstxt,ncast,i,k,m;
  34.  
  35.  
  36. long int alignfp(void)
  37. {
  38.   long int fpos;
  39.   char tmpch;
  40.  
  41.   fpos = ftell(fp);
  42.   if(fpos & 1) 
  43.   {
  44.     tmpch = fgetc(fp);
  45.     fpos++;
  46.   }
  47.   return (fpos);
  48. }
  49.  
  50. long int getmaxpos(void)
  51. {
  52.   long int fsize;
  53.  
  54.   fseek(fp, 4, SEEK_SET);
  55.   fread(&fsize, sizeof(long int), 1, fp);
  56.   return fsize;
  57. }
  58.  
  59. long int findcast(long int maxpos)
  60. {
  61.   char tmpch, cmpstr[]="txtCastNames", inpstr[80];
  62.   long int fpos;
  63.   size_t len;
  64.  
  65.   fpos = alignfp();
  66.   len = strlen(cmpstr);
  67.  
  68.   /* Detta ska vara en udda adress */
  69.   tmpch = fgetc(fp);
  70.   fpos++;
  71.  
  72.   /* Leta efter första bokstaven */
  73.   while(fpos < maxpos)
  74.   {
  75.     tmpch = fgetc(fp);
  76.     fpos++;
  77.     if(tmpch == cmpstr[0])
  78.     {
  79.       #ifdef _AMIGA
  80.         chkabort();
  81.       #endif
  82.       fread(inpstr, sizeof(char), (len - 1), fp);
  83.       inpstr[len - 1] = '\0';
  84.       if(strcmp(&cmpstr[1], inpstr)==0)
  85.       {
  86.         fpos--;
  87.         printf("Hittade strängen vid pos 0x%08x\n", fpos);
  88.         return fpos;
  89.       }
  90.       else
  91.       {
  92.         /* Backa filpekaren */
  93.         fseek(fp, fpos, SEEK_SET);
  94.       }
  95.     }
  96.     tmpch = fgetc(fp);
  97.     fpos++;
  98.   }
  99.   printf("Hittade inte strängen \"%s\"\n",cmpstr);
  100.   return -1;
  101. }
  102.  
  103. long int findcas(long int maxpos, BOOL silent)
  104. {
  105.   char tmpch, cmpstr[]="CAS*", inpstr[80];
  106.   long int fpos;
  107.   size_t len;
  108.  
  109.   fpos = alignfp();
  110.   len = strlen(cmpstr);
  111.  
  112.   /* Leta efter första bokstaven */
  113.   while(fpos < maxpos)
  114.   {
  115.     tmpch = fgetc(fp);
  116.     fpos++;
  117.     if(tmpch == cmpstr[0])
  118.     {
  119.       #ifdef _AMIGA
  120.         chkabort();
  121.       #endif
  122.       fread(inpstr, sizeof(char), (len - 1), fp);
  123.       inpstr[len - 1] = '\0';
  124.       if(strcmp(&cmpstr[1], inpstr)==0)
  125.       {
  126.         fpos--;
  127.         if(!silent)
  128.         {
  129.           printf("Hittade CAS* vid pos 0x%08x\n", fpos);
  130.         }
  131.         return fpos;
  132.       }
  133.       else
  134.       {
  135.         /* Backa filpekaren */
  136.         fseek(fp, fpos, SEEK_SET);
  137.       }
  138.     }
  139.     tmpch = fgetc(fp);
  140.     fpos++;
  141.   }
  142.   if(!silent)
  143.   {
  144.     printf("Hittade inte strängen \"%s\"\n",cmpstr);
  145.   }
  146.   return -1;
  147. }
  148.  
  149. long int findcast2(long int maxpos)
  150. {
  151.   char tmpch, cmpstr[]="CASt", inpstr[16];
  152.   long int fpos, blksize;
  153.   size_t len;
  154.   int i, allnum;
  155.  
  156.   fpos = alignfp();
  157.   len = strlen(cmpstr);
  158.  
  159.   /* Detta ska vara en jämn adress */
  160.  
  161.   /* Leta efter första bokstaven */
  162.   while(fpos < maxpos)
  163.   {
  164.     tmpch = fgetc(fp);
  165.     fpos++;
  166.     if(tmpch == cmpstr[0])
  167.     {
  168.       #ifdef _AMIGA
  169.         chkabort();
  170.       #endif
  171.       fread(inpstr, sizeof(char), (len - 1), fp);
  172.       inpstr[len - 1] = '\0';
  173.       if(strcmp(&cmpstr[1], inpstr)==0)
  174.       {
  175.         /* Kolla om CASt blocket är OK */
  176.         fread(&blksize, sizeof(long int), 1, fp);
  177.         if(blksize < 0x66)
  178.         {
  179.           fseek(fp, (blksize - 7), SEEK_CUR);
  180.         }
  181.         else
  182.         {
  183.           fseek(fp, 0x5f, SEEK_CUR);
  184.         }
  185.         /* Först ska det vara ett T (ref 46-97) */
  186.         tmpch = fgetc(fp);
  187.         allnum = 0;
  188.         if(tmpch == 'T') allnum = 1;
  189.  
  190.         /* Läs det som måste vara siffror */
  191.         fread(inpstr, sizeof(char), 4, fp);
  192.         inpstr[4] = '\0';
  193.  
  194.         /* Är alla siffror ?*/
  195.         for(i=0; i<4; i++)
  196.         {
  197.           if(isdigit((int)(inpstr[i]))==0) allnum = 0;
  198.         }
  199.         if(allnum)
  200.         {
  201.           fpos--;
  202.           printf("Hittade CASt vid pos 0x%08x\n", fpos);
  203.           return fpos;
  204.         }
  205.         fpos = alignfp();
  206.         tmpch = fgetc(fp);
  207.         fpos++;
  208.       }
  209.     }
  210.     tmpch = fgetc(fp);
  211.     fpos++;
  212.   }
  213.   printf("Hittade inte CASt\n");
  214.   return -1;
  215. }
  216.  
  217.  
  218. long int findstxt(long int maxpos)
  219. {
  220.   char tmpch, cmpstr[]="STXT", inpstr[16];
  221.   long int fpos;
  222.   size_t len;
  223.   int i, alltext;
  224.  
  225.   fpos = alignfp();
  226.   len = strlen(cmpstr);
  227.  
  228.   /* Detta ska vara en jämn adress */
  229.  
  230.   /* Leta efter första bokstaven */
  231.   while(fpos < maxpos)
  232.   {
  233.     tmpch = fgetc(fp);
  234.     fpos++;
  235.     if(tmpch == cmpstr[0])
  236.     {
  237.       #ifdef _AMIGA
  238.         chkabort();
  239.       #endif
  240.       fread(inpstr, sizeof(char), (len - 1), fp);
  241.       inpstr[len - 1] = '\0';
  242.       if(strcmp(&cmpstr[1], inpstr)==0)
  243.       {
  244.         /* printf("fp=0x%lx\n",ftell(fp)); */
  245.         /* Kolla om STXT blocket är OK */
  246.         fseek(fp, 16, SEEK_CUR);
  247.         fread(inpstr, sizeof(char), 16, fp);
  248.  
  249.         /* Är det text? */
  250.         alltext = 1;
  251.         for(i=0; i<16; i++)
  252.         {
  253.           if(inpstr[i]<0x09 && inpstr[i]>=0x00) alltext = 0;
  254.         }
  255.  
  256.         /* Kolla om det är "siffertabellen" */
  257.         alltext = -alltext;
  258.         for(i=1; i<6; i++)
  259.         {
  260.           if(inpstr[i]<'0' || inpstr[i]>'9') alltext = abs(alltext);
  261.         }
  262.  
  263.         if(alltext>0)
  264.         {
  265.           fpos--;
  266.           printf("Hittade STXT vid pos 0x%08x\n", fpos);
  267.           return fpos;
  268.         }
  269.       }
  270.       /* Backa filpekaren */
  271.       fseek(fp, fpos, SEEK_SET);
  272.     }
  273.     tmpch = fgetc(fp);
  274.     fpos++;
  275.   }
  276.   printf("Hittade inte STXT\n");
  277.   return -1;
  278. }
  279.  
  280.  
  281. int main(int argc, char *argv[])
  282. {
  283.   long int maxpos, strfpos, castpos, stxtpos;
  284.  
  285.   /* Kolla ev. inparametrar */
  286.  
  287.   if(argc!=2) 
  288.   {
  289.     printf("Usage: %s filename\n", argv[0]);
  290.     return 0;
  291.   }
  292.   else 
  293.   {
  294.     /* Fixa filnamn */
  295.     if(strlen(argv[1])<4) 
  296.     {
  297.       sscanf(argv[1],"%d",&slask);
  298.       sprintf(infile,"CD0:TEXT/T%03d.DXR",slask);
  299.     }
  300.   }
  301.  
  302.   /* Öppna filen */
  303.   printf("Öppnar %s\n",infile);
  304.   fp = fopen(infile, "r");
  305.  
  306.   /* Felhantering */
  307.   if(fp == NULL)
  308.   {    
  309.     printf("\n*** Kunde inte öppna filen: %s \n",infile);
  310.     return EXIT_FAILURE;
  311.   }
  312.  
  313.   /* Sök */
  314.   maxpos = getmaxpos();
  315.   printf("Söker...\n");
  316.   strfpos = findcast(maxpos - 16);
  317.   if(strfpos>0)
  318.   {
  319.     castpos = findcast2(maxpos - 16);
  320.     stxtpos = findstxt(maxpos -16);
  321.   }
  322.   else
  323.   {
  324.     maxpos = getmaxpos();
  325.     strfpos = findcas(maxpos - 16, TRUE);
  326.     strfpos = findcas(maxpos - 16, TRUE);
  327.     strfpos = findcas(maxpos - 16, FALSE);
  328.     if(strfpos>0)
  329.     {
  330.       castpos = findcast2(maxpos - 16);
  331.       stxtpos = findstxt(maxpos -16);
  332.     }
  333.   }
  334.   fclose(fp);
  335.  
  336. }
  337.  
  338.  
  339.  
  340.